﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WatiN.Core;
using WatiN.Core.DialogHandlers;
using Util;

namespace tea.Tests
{
    [TestClass]
    public class 강의지원
    {
        [ClassInitialize]
        public static void DB테스트준비(TestContext context)
        {
            DB.초기화();
            DB.사용자생성("test1", "test", "테스트", "test@test.com");
            DB.강의생성("1학기", "국어");
            DB.강의생성("2학기", "영어");
            DB.강의생성("매학기", "수학");
        }

        private void 강의추가(IE ie, string 강의명)
        {
            ie.Link(Find.ByText("강의추가")).Click();
            ie.TextField(Find.ById("강의대화상자_검색패턴")).Value = 강의명;
            ie.Button(Find.BySelector("#강의대화상자 .form-horizontal .btn")).Click();
            ie.Eval("$('div[data-key]:first-child').addClass('ui-selected')");
            ie.Link(Find.ByText("확인")).Click();
        }

        [TestMethod]
        public void 강의지원테스트1()
        {
            string s;
            IE ie = new IE("http://localhost:6378/Guest/Login?ReturnUrl=%2f");

            // 로그인하고
            로그인.로그인하기("test1", "test", ie);

            // 강의지원 화면으로 이동
            ie.Link(Find.ByText("강의지원")).Click();
            Assert.IsTrue(ie.Url.Contains("/Application/List"));

            // 신청서 작성 버튼 누르기
            ie.링크누르고메시지확인(".btn-primary", "기간이 아닙니다");

            // 신청 기간이 아닌 채용 생성 후 확인
            int ID = DB.채용생성(DateTime.Now.AddMonths(2), DateTime.Now.AddMonths(3), "채용내용");
            ie.링크누르고메시지확인(".btn-primary", "기간이 아닙니다");

            DB.채용수정(ID, DateTime.Now.AddMonths(-3), DateTime.Now.AddMonths(-2));
            ie.링크누르고메시지확인(".btn-primary", "기간이 아닙니다");

            // 이력서 미작성 에러 확인
            DB.채용수정(ID, DateTime.Now.AddMonths(-1), DateTime.Now.AddMinutes(1));
            ie.링크누르고메시지확인(".btn-primary", "이력서를");

            DB.이력서생성("test1", null, null);
            ie.링크누르고메시지확인(".btn-primary", "이력서를");

            DB.이력서수정("test1", "1980-01-01", null);
            ie.링크누르고메시지확인(".btn-primary", "이력서를");

            DB.이력서수정("test1", "1980-01-01", "남");
            ie.링크누르고메시지확인(".btn-primary", "이력서를");

            DB.이력서학력생성("test1", "학사", "한국", "2001-01", "2001-02", "성공회대학교", "소프트웨어공학과");

            // 신청서 작성
            ie.Link(Find.BySelector(".btn-primary")).Click();
            Assert.IsTrue(ie.Url.Contains("/Application/New"));
            Assert.IsTrue(ie.ContainsText("채용내용"));
            Assert.IsTrue(ie.ContainsText("신청"));

            // 강의 추가
            강의추가(ie, "국어");
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "1");
            s = ie.Eval("$('tbody').html()");
            Assert.IsTrue(s.Contains("국어"));

            강의추가(ie, "영어");
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "2");
            s = ie.Eval("$('tbody').html()");
            Assert.IsTrue(s.Contains("영어"));

            // 중단된 과목 검색 안되니 신청 불가
            DB.강의생성("1학기", "과학", true);
            ie.Link(Find.ByText("강의추가")).Click();
            ie.TextField(Find.ById("강의대화상자_검색패턴")).Value = "";
            ie.Button(Find.BySelector("#강의대화상자 .form-horizontal .btn")).Click();
            s = ie.Eval("$('#강의대화상자_검색결과').html()");
            Assert.IsFalse(s.Contains("과학"));
            ie.Link(Find.ByText("취소")).Click();

            // 국어 삭제
            ie.CheckBox(Find.ByIndex(1)).Click();
            ie.Link(Find.ByText("삭제")).Click();
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "1");
            s = ie.Eval("$('tbody').html()");
            Assert.IsFalse(s.Contains("국어"));

            강의추가(ie, "국어");
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "2");
            s = ie.Eval("$('tbody').html()");
            Assert.IsTrue(s.Contains("국어"));

            // 임용 계약 미선택 에러 확인
            ie.링크누르고메시지확인(".btn-primary", "임용계약");

            // 저장하고
            ie.CheckBox(Find.ByIndex(0)).Click();
            ie.링크누르고메시지확인(".btn-primary", "저장");

            // 목록으로 나가서 확인
            ie.Link(Find.ByText(p => p.Contains("목록으로"))).Click();
            Assert.IsTrue(ie.Url.Contains("/Application/List"));
            Assert.AreEqual(ie.Eval("$('tbody tr').length"), "1");
            s = ie.Eval("$('tbody').html()");
            Assert.IsTrue(s.Contains("<td>신청</td>"));
            Assert.IsTrue(s.Contains("<td>테스트</td>"));
            Assert.IsTrue(s.Contains(DateTime.Now.ToString("yyyy-MM-dd HH")));
            Assert.IsTrue(s.Contains("<td>2</td>"));

            // 신규 버튼을 눌러도, 편집 모드로
            ie.Link(Find.BySelector(".btn-primary")).Click();
            Assert.IsTrue(ie.Url.Contains("/Application/Form"));
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "2");

            // 나갔다가, 목록에서 클릭하여 다시 들어와서 강의 추가하고 저장
            ie.Link(Find.ByText(p => p.Contains("목록으로"))).Click();
            ie.Link(Find.BySelector(".btn-primary")).Click();
            강의추가(ie, "수학");
            Assert.AreEqual(ie.Eval("$('form#강의목록 table tbody tr').length"), "3");
            ie.링크누르고메시지확인(".btn-primary", "저장");

            // 목록으로 나가서 확인
            ie.Link(Find.ByText(p => p.Contains("목록으로"))).Click();
            Assert.IsTrue(ie.Url.Contains("/Application/List"));
            Assert.AreEqual(ie.Eval("$('tbody tr').length"), "1");
            s = ie.Eval("$('tbody').html()");
            Assert.IsTrue(s.Contains("<td>3</td>"));

            // 신청 기간이 아니면, 신규 버튼을 누를 수 없음
            DB.채용수정(ID, DateTime.Now.AddMonths(-3), DateTime.Now.AddDays(-2));
            ie.링크누르고메시지확인(".btn-primary", "기간이 아닙니다");
            ie.TableRow(Find.BySelector("tbody tr:first-child")).Click();
            Assert.IsFalse(ie.ContainsText("저장하기"));
            Assert.IsFalse(ie.ContainsText("강의삭제"));
            
            // 신청기간으로 변경하고
            DB.채용수정(ID, DateTime.Now.AddMonths(-1), DateTime.Now.AddMinutes(1));
            ie.Refresh();
            Assert.IsTrue(ie.ContainsText("신청하기"));
            Assert.IsTrue(ie.ContainsText("강의삭제"));

            // 삭제하기
            ie.컨펌버튼누르기(" 삭제");
            System.Threading.Thread.Sleep(500);
            Assert.IsTrue(ie.Url.Contains("/Application/List"));
            Assert.AreEqual(ie.Eval("$('tbody tr').length"), "0");

            ie.WaitForComplete();
            ie.Dispose();
        }

    }
}
